package pres.liko.iot.sdk.api;

import io.github.pnoker.common.bean.R;
import io.github.pnoker.common.bean.driver.command.CmdParameter;
import io.github.pnoker.common.bean.point.PointValue;
import io.github.pnoker.common.constant.ServiceConstant;
import io.github.pnoker.common.valid.ValidatableList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import pres.liko.iot.sdk.service.DriverCommandService;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @ClassName: DriverCommandApi
 * @Auther: liko
 * @Description:
 * @Date: 2022/11/7 17:01
 */
@RestController
@RequestMapping(ServiceConstant.Driver.COMMAND_URL_PREFIX)
public class DriverCommandApi {

    @Autowired
    private DriverCommandService driverCommandService;

    /**
     * @param cmdParameters 这是一个集合，集合的泛型是我们想要操作的位号的id属性，
     *                      这样我们就知道想要读取什么数据了
     *                      比如我们要向一个温湿度传感器读取温度数据，
     *                      只需要告诉我们温湿度传感器的id,已经想要读取的是温度数据
     *                      这样就会返回温度的数据
     * @return 我们想要读取位号的相关的值，从设备中读取出来，
     * 然后转成pointValue的数据，最终返回，pointValue里面就是包括什么设备什么位号，对应的值
     */
    public R<List<PointValue>> readPoint(@RequestBody ValidatableList<CmdParameter> cmdParameters) {
        return R.ok(cmdParameters.stream().map(cmdParameter -> driverCommandService.read(cmdParameter.getDeviceId(), cmdParameter.getPointId()))
                .collect(Collectors.toList()));
    }

    /**
     * 向指定的设备写入指定位号的数据
     * 比如我们想向id为xxx的设备的开关的操作写入一个开或者关的命令
     *
     * @param cmdParameters
     * @return
     */
    public R<Boolean> writePoint(@RequestBody ValidatableList<CmdParameter> cmdParameters) {
        try {
            cmdParameters.forEach(cmdParameter -> {
                driverCommandService
                        .write(cmdParameter.getDeviceId(), cmdParameter.getPointId(), cmdParameter.getValue());
            });
            return R.ok();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return R.fail();
    }
}
